/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.sadhar.sipp.perekamankelompokbiaya;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.sadhar.cektabel.cekTabel;
import org.sadhar.cektabel.cekTabelDAO;
import org.sadhar.cektabel.cekTabelDAOImpl;
import org.sadhar.errhandler.ClassAntiNull;
import org.sadhar.sia.common.ClassConnection;
import org.sadhar.sia.common.ClassUtility;

/**
 * 
 * @author Yohan Hardinugroho
 */
public class PerekamanKelompokBiayaDAOImpl implements PerekamanKelompokBiayaDAO {

    public PerekamanKelompokBiayaDAOImpl() {
        ClassConnection.getTransactionProxyFactoryBean().setTarget(this);
    }

    public List<Map> listDetails() {
        /*Nama-nama field
         * kodeKelompokBiaya,tahunKelompok,isUmum,namaPosBiaya,namajenisBiaya,kelompokPengurusBiaya
         */
        List<Map> result = ClassConnection.getJdbc().queryForList(
                "SELECT k.kodeKelompokBiaya,k.tahunKelompok,k.isUmum,k.isMutlak,p.kodePosBiaya,p.namaPosBiaya,j.jenisBiaya,kpb.kelompokPengurusBiaya FROM ppmk.kelompokBiaya k" + " inner join ppmk.posBiaya p on (k.kodePosBiaya = p.kodePosBiaya)" + " inner join ppmk.jenisBiaya j on (k.kodeJenisBiaya = j.kodeJenisBiaya)" + " left join ppmk.kelompokPengurusBiaya kpb on (p.kodeKelompokPengurusBiaya = kpb.kodeKelompokPengurusBiaya)" + " order by j.jenisBiaya,p.namaPosBiaya");

        String currentNamaPostBiaya = "";
        for (Map m : result) {

            if (currentNamaPostBiaya.equalsIgnoreCase(m.get("jenisBiaya").toString())) {
                m.put("jenisBiaya", "");
                m.put("namaJenisBiayaHidden", currentNamaPostBiaya);
            } else {
                currentNamaPostBiaya = m.get("jenisBiaya").toString();
                m.put("namaJenisBiayaHidden", "");
            }
        }
        return result;
    }

    public List<Map> listDetails(String tahun) {
        /*Nama-nama field
         * kodeKelompokBiaya,tahunKelompok,isUmum,namaPosBiaya,namajenisBiaya,kelompokPengurusBiaya
         */
        List<Map> result = ClassConnection.getJdbc().queryForList(
                "SELECT k.kodeKelompokBiaya,k.tahunKelompok,k.isUmum,k.isMutlak,p.kodePosBiaya,p.namaPosBiaya,j.jenisBiaya,kpb.kelompokPengurusBiaya FROM ppmk.kelompokBiaya k" + " inner join ppmk.posBiaya p on (k.kodePosBiaya = p.kodePosBiaya)" + " inner join ppmk.jenisBiaya j on (k.kodeJenisBiaya = j.kodeJenisBiaya)" + " left join ppmk.kelompokPengurusBiaya kpb on (p.kodeKelompokPengurusBiaya = kpb.kodeKelompokPengurusBiaya)" + " where k.tahunKelompok = ? order by j.jenisBiaya,p.namaPosBiaya", new Object[]{ClassUtility.quote(tahun)});

        String currentNamaPostBiaya = "";
        for (Map m : result) {

            if (currentNamaPostBiaya.equalsIgnoreCase(m.get("jenisBiaya").toString())) {
                m.put("jenisBiaya", "");
                m.put("namaJenisBiayaHidden", currentNamaPostBiaya);
            } else {
                currentNamaPostBiaya = m.get("jenisBiaya").toString();
                m.put("namaJenisBiayaHidden", "");
            }
        }
        return result;
    }

    public List<Map> listDistinct() {
        return ClassConnection.getJdbc().queryForList(
                "SELECT distinct tahunKelompok FROM ppmk.kelompokBiaya order by tahunKelompok asc");
    }

    public void insert(PerekamanKelompokBiaya kelompok) throws Exception {
        String sql = "INSERT INTO ppmk.kelompokBiaya(tahunKelompok,kodeJenisBiaya,kodePosBiaya,isUmum,isMutlak) " + "VALUES(?,?,?,?,'N')";
        ClassConnection.getJdbc().update(
                sql,
                new Object[]{ClassUtility.quote(kelompok.getTahunKelompok()),
                    Integer.valueOf(kelompok.getKodeJenisBiaya()),
                    Integer.valueOf(kelompok.getKodePosBiaya()),
                    ClassUtility.quote(kelompok.getIsUmum())
                });
    }

    public void update(PerekamanKelompokBiaya kelompok) throws Exception {
        String sql = "UPDATE ppmk.kelompokBiaya SET tahunKelompok=?,kodeJenisBiaya=?,kodePosBiaya=?,isUmum=? where kodeKelompokBiaya=?";
        ClassConnection.getJdbc().update(
                sql,
                new Object[]{ClassUtility.quote(kelompok.getTahunKelompok()),
                    Integer.valueOf(kelompok.getKodeJenisBiaya()),
                    Integer.valueOf(kelompok.getKodePosBiaya()),
                    ClassUtility.quote(kelompok.getIsUmum()),
                    Integer.valueOf(kelompok.getKodeKelompokBiaya())
                });
    }

    public void delete(PerekamanKelompokBiaya kelompok) throws Exception {
        String sql = "DELETE FROM ppmk.kelompokBiaya WHERE kodeKelompokBiaya=?";
        ClassConnection.getJdbc().update(
                sql,
                new Object[]{Integer.valueOf(kelompok.getKodeKelompokBiaya())});
    }

    @Override
    public void delete(int kodeKelompokBiaya) throws Exception {
        String sql = "DELETE FROM ppmk.kelompokBiaya WHERE kodeKelompokBiaya=?";
        ClassConnection.getJdbc().update(
                sql,
                new Object[]{Integer.valueOf(kodeKelompokBiaya)});
    }

    @Override
    public long countByTahunAndKodePosBiaya(String tahun, int kodePosBiaya) throws Exception {
        String sql = "SELECT count(*) as jumlah FROM ppmk.kelompokBiaya k where k.tahunKelompok = ? and k.kodePosBiaya=?";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{ClassUtility.quote(tahun), Integer.valueOf(kodePosBiaya)});
        long ires = 0;
        for (Map m : result) {
            ires = (Long) m.get("jumlah");
        }
        return ires;
    }

    /*
     * SELECT k.kodeKelompokBiaya,k.tahunKelompok,k.isUmum,pb.namaPosBiaya,pb.kodePosBiaya
    FROM kelompokbiaya k
    inner join posBiaya pb on (k.kodePosBiaya = pb.kodePosBiaya)
    where k.isUmum='N' and k.tahunKelompok='2009';
     *
     */
    public List<Map> listByTahunAndIsUmum(String tahun, String isUmum) throws Exception {
        String sql = "SELECT k.kodeKelompokBiaya,k.tahunKelompok,k.isUmum,k.isMutlak," +
                " p.kodePosBiaya,p.namaPosBiaya,j.jenisBiaya,kpb.kelompokPengurusBiaya" +
                " FROM ppmk.kelompokBiaya k" +
                " inner join ppmk.posBiaya p on (k.kodePosBiaya = p.kodePosBiaya)" +
                " inner join ppmk.jenisBiaya j on (k.kodeJenisBiaya = j.kodeJenisBiaya)" +
                " left join ppmk.kelompokPengurusBiaya kpb on (p.kodeKelompokPengurusBiaya = kpb.kodeKelompokPengurusBiaya)" +
                " where k.isUmum=? and k.tahunKelompok=? ";

        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{ClassUtility.quote(isUmum), ClassUtility.quote(tahun)});
        return result;
    }

    @Override
    public List<Map> listByTahun(String tahun) {
        String sql = "SELECT * FROM ppmk.kelompokBiaya k where k.tahunKelompok =?";
        // TODO Auto-generated method stub
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{ClassUtility.quote(tahun)});
        return result;
    }

    public long cekTableAnak(int kodeKelompokBiaya) {
        String sql = "select count(kodeKelompokBiaya) as count from ppmk.kelompokBiaya as kb " +
                " where kb.kodeKelompokBiaya =? " +
                " and (kb.kodeKelompokBiaya IN " +
                " (select kb.kodeKelompokBiaya from ppmk.kelompokBiaya as kb,  ppmk.subkelompokAnggaranBiaya as sub " +
                " where sub.kodeKelompokBiaya=kb.kodeKelompokBiaya) or kb.kodeKelompokBiaya " +
                " in(select kb.kodeKelompokBiaya from ppmk.kelompokBiaya as kb, ppmk.posBiayaKhususUnit as kh " +
                " where kh.kodeKelompokBiaya=kb.kodeKelompokBiaya))";
        List<Map> result = ClassConnection.getJdbc().queryForList(sql, new Object[]{Integer.valueOf(kodeKelompokBiaya)});
        long isine = 0;
        for (Map m : result) {
            isine = ClassAntiNull.AntiNullLong(m.get("count"));
        }

        return isine;
    }

     // revisied by : taufan (BAPSI)
    public boolean cekDataTabel(String table, String[] field, String[] value) {
        cekTabel obj = new cekTabel();
        cekTabelDAO dao = new cekTabelDAOImpl();
        List lsNamaField = new ArrayList();
        List lsValueField = new ArrayList();
        for (int i = 0; i < field.length; i++) {
            lsNamaField.add(field[i].toString());
            lsValueField.add(value[i].toString());
        }
        obj.setNamaTabel(table);
        obj.setNamaField(lsNamaField);
        obj.setValueField(lsValueField);
        if (dao.cekTabel(obj)) {
            return true;
        } else {
            return false;
        }
    }
    //

}

